# log.gd
extends Node

#region 常量与配置项
# 日志级别枚举（按严重程度递增排序）
enum Level {
	DEBUG, # 调试信息（开发时使用）
	INFO, # 常规运行信息
	WARNING, # 需要关注的异常情况
	ERROR # 严重错误事件
}

# 日志系统配置参数
var _log_file_path = "user://game_log.txt" # 日志文件存储路径
var _current_level = Level.INFO # 当前日志记录级别（默认INFO）
var _enable_console = true # 是否启用控制台输出
var _enable_file = true # 是否启用文件记录
#endregion

#region 生命周期方法
func _ready():
	"""节点初始化时自动调用，执行日志系统初始化"""
	if _enable_file:
		_clear_log_file() # 清空历史日志（仅当启用文件记录时）
	
#endregion

#region 公共接口
func set_log_level(level: Level):
	"""设置日志记录级别（过滤低于该级别的日志）"""
	_current_level = level

func debug(message: String, tag: String = "DEBUG"):
	"""记录调试级别日志（浅灰色）"""
	_log(message, tag, Level.DEBUG, Color.DARK_GRAY)

func info(message: String, tag: String = "INFO"):
	"""记录信息级别日志（宝蓝色）"""
	_log(message, tag, Level.INFO, Color.ROYAL_BLUE)

func warning(message: String, tag: String = "WARNING"):
	"""记录警告级别日志（金褐色）"""
	_log(message, tag, Level.WARNING, Color.GOLDENROD)

func error(message: String, tag: String = "ERROR"):
	"""记录错误级别日志（火砖红）"""
	_log(message, tag, Level.ERROR, Color.FIREBRICK)
#endregion

#region 核心实现
func _log(message: String, tag: String, level: int, color: Color):
	"""
	日志记录核心方法
	参数：
	- message: 日志内容
	- tag:     日志分类标签
	- level:   日志级别（用于过滤）
	- color:   控制台输出颜色
	"""
	if level < _current_level:
		return
	
	var timestamp = Time.get_time_string_from_system()
	var log_message = "[%s][%s] %s" % [timestamp, tag, message]
	
	if _enable_console:
		var colored_message = "[color=#%s]%s[/color]" % [color.to_html(false), log_message]
		print_rich(colored_message)
	
	if _enable_file:
		_write_to_file(log_message + "\n")

func _write_to_file(text: String):
	"""将文本追加写入日志文件"""
	var file = FileAccess.open(_log_file_path, FileAccess.WRITE_READ)
	if file:
		file.seek_end()
		file.store_string(text)
	else:
		push_error("Failed to write to log file: " + _log_file_path)

func _clear_log_file():
	"""清空日志文件内容"""
	var file = FileAccess.open(_log_file_path, FileAccess.WRITE)
	if file:
		file.store_string("")
	else:
		push_error("Failed to clear log file: " + _log_file_path)
#endregion
